package com.baseutil;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.base.Preconditions.*;

public class PreconditionsDemo {
    /**
     * Guava在Preconditions类中提供了若干前置条件判断的实用方法:检查失败会抛出对应异常
     *   每个方法都有三个变种：
     *      1 没有额外参数：抛出的异常中没有错误消息；
     *      2 有一个Object对象作为额外参数：抛出的异常使用Object.toString() 作为错误消息；
     *      3 有一个String对象作为额外参数，并且有一组任意数量的附加Object对象：
     *          这个变种处理异常消息的方式有点类似printf，但考虑GWT的兼容性和效率，只支持%s指示
     */
    /**
     * checkArgument(boolean) 检查boolean是否为true，用来检查传递给方法的参数。
     */
    @Test
    public void checkArgumentTest(){
        checkArgument(1==1); //直接抛出异常
        checkArgument(1==1,"参数错误"); //返回自定义错误信息
        // 使用变量错误信息,只支持 %s
        checkArgument(1==2,"Expected i == j, but %s < %s",1,2);
    }

    /**
     * checkNotNull(T):
     *        检查value是否为null，该方法直接返回value，因此可以内嵌使用checkNotNull。
     */
    @Test
    public void checkNotNullTest(){
        checkNotNull(""); //为null时抛出异常
        String name="hou";
        String newname = checkNotNull(name, "参数为null");
        System.out.println(newname); // hou
    }

    /**
     *   checkState(boolean)	用来检查对象的某些状态
     */
    @Test
    public void checkStateTest(){
        String str="hou";
        checkState(str.startsWith("h"));
        checkState(str.startsWith("z"),"str不以z开头");
    }

    /**
     * checkElementIndex(int index, int size)
     *      检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size *
     * checkPositionIndex(int index, int size)
     *      检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size *
     * checkPositionIndexes(int start, int end, int size)
     *      检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效*

     *  失败时抛出IndexOutOfBoundsException
     */
    @Test
    public void checkElementIndexTest(){
        List<Integer> list=new ArrayList();
        list.add(1);
        list.add(2);
        list.add(4);
        list.add(3);
        /**
         * 索引值常用来查找列表、字符串或数组中的元素，如List.get(int), String.charAt(int)
         *
         * 位置值和位置范围常用来截取列表、字符串或数组，如List.subList(int，int), String.substring(int)
         */
        checkElementIndex(list.indexOf(1),list.size()); //索引
        checkPositionIndex(0,list.size());  //位置
        checkPositionIndexes(1,3,list.size()); //区间
    }

}
